﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Uricao.Presentadores
{
    public class Validaciones
    {

        #region Atributos de Validaciones
        private List<String> _datos;
        private bool _valido;
        private string _expresionesRegulares;
        private Regex _rgTexto;
        private DateTime _hoy = DateTime.Now;
        private int _minimoCaracteres = 4;
        private int _maximoCaracteres = 100;
        private string _formatoFecha = "dd/MM/yyyy";
        private DateTime _fecha;
        #endregion

        #region Metodo de validaciones
        ///<sumary>
        ///Metodo que se encarga de suministrar el objeto de la clase Validaciones   
        ///Retorno: objeto de la clase validaciones
        ///</sumary>
        public static Validaciones ObtenerValidaciones()
        {
            return new Validaciones();
        }

        ///<sumary>
        ///Constructor de la clase Validaciones
        ///</sumary>
        private Validaciones()
        {
            _datos = new List<string>();
        }

        ///<sumary>
        ///Metodo que se encarga de recorrer la lista de datos para vaildar la expresion regular indicada
        ///Retorno: true, si todo los datos de la lista cumplen con la expresion regular
        ///         false, si al menos un dato no cumple con la expresion regular
        ///</sumary>
        private bool ValidarExpresionRegular()
        {
            _valido = true;
            for (int i = 0; i < _datos.Count; i++)
            {
                if (!_rgTexto.IsMatch(_datos[i]))
                {
                    _valido = false;
                }
            }
            return _valido;
        }

        ///<sumary>
        ///Metodo que se encarga de suministrar la informacion de datos a validad a la lista de datos 
        /// String dato: datos que se desea validar 
        ///</sumary>
        public void AgregarDatosAValidar(String dato)
        {
            _datos.Add(dato);
        }


        ///<sumary>
        ///Metodo que se encarga de validar si los datos de la lista alguno de ellos esta vacio  
        ///Retorno: true, sin ningun dato en la lista esta vacio
        ///         false, si al menos un dato es igual a vacio
        ///</sumary>
        public bool ValidarCamposVacios()
        {
            String caracterVacio = "";

            _valido = true;

            for (int i = 0; i < _datos.Count; i++)
            {
                if (_datos[i].Equals(caracterVacio))
                {
                    _valido = false;
                    break;
                }
            }
            return _valido;
        }

        ///<sumary>
        ///Metodo que se encarga de validar en la lista de datos si cumplen 
        ///con la expresion regular solo de caracteres alfabeticos  
        ///Retorno: true, si todo los datos de la lista cumplen con la expresion regular
        ///         false, si al menos un dato no cumple con la expresion regular
        ///</sumary>
        public bool ValidarCaracteresAlfabeticos()
        {
            _expresionesRegulares = "^[A-Z a-z]*$";
            _rgTexto = new Regex(_expresionesRegulares);
            _valido = ValidarExpresionRegular();
            return _valido;
        }

        ///<sumary>
        ///Metodo que se encarga de validar en la lista de datos si cumplen 
        ///con la expresion regular solo de caracteres alfanumericos 
        ///Retorno: true, si todo los datos de la lista cumplen con la expresion regular
        ///         false, si al menos un dato no cumple con la expresion regular
        ///</sumary>
        public bool ValidarCaracteresAlfaNumericos()
        {
            _expresionesRegulares = "\\w";
            _rgTexto = new Regex(_expresionesRegulares);
            _valido = ValidarExpresionRegular();
            return _valido;

        }

        /// <summary>
        /// Metodo que se encarga de validad en la lista de datos si cumplen
        /// con la expresion regular de caracteres numericos
        /// Retorno boolean: true, si los datos cumplen con la expresion regular
        ///                 false, si los datos no cumplen con la expresion regular
        /// </summary>
        public bool ValidarCaracteresNumericos()
        {
            _expresionesRegulares = "\\d";
            _rgTexto = new Regex(_expresionesRegulares);
            _valido = ValidarExpresionRegular();
            return _valido;
        }
        
        /// <summary>
        /// Metodo que valida que la lista de fechas no sean mayores a la fecha actual del sistema
        /// Retorna un boolean: true, si las fechas son menores a la fecha actual del sistema
        ///                     false, si por lo menos una fecha es mayor a la fecha actual
        /// </summary>
        public bool ValidarFechasConLaFechaActualMenores()
        {
            _valido = true;
            for (int i = 0; i < _datos.Count; i++)
            {
                _fecha = Convert.ToDateTime(_datos[i]);
                if (_fecha.CompareTo(_hoy) > 0)
                {
                    _valido = false;
                    break;
                }
            }

            return _valido;
        }

        /// <summary>
        /// Metodo que valida si la hora indicada en la lista de datos es mayor a la hora de la fecha sistema
        /// Retorna un boolean: true, si la hora es mayor a la hora de la fecha actual
        ///                     false, si al menos una de las hora es menor a la hora de la fecha del sistema
        /// </summary>
        public bool ValidarFechayHoraConLaFechaYHoraActual()
        {
            _valido = true;
            string fechaYHora;
            for (int i = 0; i < _datos.Count; i++)
            {
                fechaYHora = _hoy.ToString(_formatoFecha) + ' ' + _datos[i];
                _fecha = Convert.ToDateTime(fechaYHora);
                if (_fecha.CompareTo(_hoy) < 0)
                {
                    _valido = false;
                    break;
                }
            }

            return _valido;
        }

        ///<sumary>
        ///Metodo que se encarga de limpiar la lista de datos 0
        ///</sumary>
        public void LimpiarListaDeDatos()
        {
            _datos.Clear();
        }

        

        #endregion
    }
}
